home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / libcs / wantwrite.c < prev   
C/C++ Source or Header  |  1995-06-12  |  5KB  |  140 lines

  1. /*
  2.  * Copyright (c) 1990 Carnegie Mellon University
  3.  * All Rights Reserved.
  4.  * 
  5.  * Permission to use, copy, modify and distribute this software and its
  6.  * documentation is hereby granted, provided that both the copyright
  7.  * notice and this permission notice appear in all copies of the
  8.  * software, derivative works or modified versions, and any portions
  9.  * thereof, and that both notices appear in supporting documentation.
  10.  *
  11.  * THE SOFTWARE IS PROVIDED "AS IS" AND CARNEGIE MELLON UNIVERSITY
  12.  * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
  13.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO EVENT
  14.  * SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE FOR ANY SPECIAL, DIRECT,
  15.  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
  16.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
  17.  * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  18.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19.  *
  20.  * Users of this software agree to return to Carnegie Mellon any
  21.  * improvements or extensions that they make and grant Carnegie the
  22.  * rights to redistribute these changes.
  23.  *
  24.  * Export of this software is permitted only after complying with the
  25.  * regulations of the U.S. Deptartment of Commerce relating to the
  26.  * Export of Technical Data.
  27.  */
  28. /*  wantwrite  --  attempt to open file for output
  29.  *
  30.  *  Usage:  i = wantwrite (path,file,fullname,prompt,warn);
  31.  *    int i,warn;
  32.  *    char *path,*file,*fullname,*prompt;
  33.  *
  34.  *  Wantwrite will attempt to open "file" for output somewhere in
  35.  *  the pathlist "path".  If no such file can be created, the user
  36.  *  is given an oportuity to enter a new file name (after the
  37.  *  prompt is printed).  The new file will then be sought using
  38.  *  the same path.
  39.  *  If the path is the null string, the file will be created with
  40.  *  no prefix to the file name.  If the file name is null, the
  41.  *  user will be prompted for a file name immediately.  The user
  42.  *  can always abort wantwrite by typing just a carriage return
  43.  *  to the prompt.
  44.  *  Wantwrite will put the name of the successfully created file
  45.  *  into the "fullname" string (which must therefore be long enough to
  46.  *  hold a complete file name), and return its file descriptor;
  47.  *  if no file is created, -1 will be returned.
  48.  *  Wantwrite examines each entry in the path, to see if the
  49.  *  desired file can be created there.  If "warn" is true, 
  50.  *  wantwrite will first check to ensure that no such file
  51.  *  already exists (if it does, the user is allowed to keep it).
  52.  *  If no such file exists (or the user wants to delete it), then
  53.  *  wantwrite attempts to create the file.  If it is unsuccessful,
  54.  *  the next entry in the pathlist is examined in the same way.
  55.  *
  56.  *  HISTORY
  57.  * $Log:    wantwrite.c,v $
  58.  * Revision 1.2  90/12/11  18:01:02  mja
  59.  *     Add copyright/disclaimer for distribution.
  60.  * 
  61.  * 30-Apr-85  Steven Shafer (sas) at Carnegie-Mellon University
  62.  *    Adapted for 4.2 BSD UNIX:  New open call, output moved to stderr.
  63.  *
  64.  * 21-Oct-81  Fil Alleva (faa) at Carnegie-Mellon University
  65.  *    Fixed bug which caused an infinite loop when getstr() got
  66.  *    an EOT error and returned NULL. The error return was ignored
  67.  *    and the value of "answer" was not changed which caused the loop.
  68.  *
  69.  * 20-Nov-79  Steven Shafer (sas) at Carnegie-Mellon University
  70.  *    Rewritten for VAX.
  71.  *
  72.  */
  73.  
  74. #include <stdio.h>
  75. #include <sys/file.h>
  76.  
  77. int strcmp();
  78. int creat();
  79. int searchp();
  80. char *getstr();
  81.  
  82. static int warnflag;
  83. static int fildes;
  84.  
  85. static int func (fnam)
  86. char *fnam;
  87. {        /* attempt to create fnam */
  88.     register int goahead;
  89.     goahead = 1;
  90.     if (warnflag) {
  91.         fildes = open (fnam,O_WRONLY,0);
  92.         if (fildes >= 0) {
  93.             close (fildes);
  94.             fprintf (stderr,"%s already exists!  ",fnam);
  95.             goahead = getbool ("Delete old file?",0);
  96.         }
  97.     }
  98.     if (goahead) {
  99.         fildes = open (fnam,(O_WRONLY|O_CREAT|O_TRUNC),0644);
  100.         if (fildes < 0) {
  101.             goahead = 0;
  102.         }
  103.     }
  104.     return (!goahead);
  105. }
  106.  
  107. int wantwrite (path,file,fullname,prompt,warn)
  108. char *path,*file,*fullname,*prompt;
  109. int warn;
  110. {
  111.     register int i;
  112.     char myfile [2000], *retval;
  113.  
  114.     fflush (stdout);
  115.     if (*file == '\0') {
  116.         getstr (prompt,"no file",myfile);
  117.         if (strcmp(myfile,"no file") == 0)  return (-1);
  118.     }
  119.     else strcpy (myfile,file);
  120.  
  121.     warnflag = warn;
  122.     do {
  123.         i = searchp (path,myfile,fullname,func);
  124.         if (i < 0) {
  125.             if (*path && (*myfile != '/')) {
  126.                 fprintf (stderr,"%s in path \"%s\":  Can't create.\n",myfile,path);
  127.             } 
  128.             else {
  129.                 perror (myfile);
  130.             }
  131.             retval = getstr (prompt,"no file",myfile);
  132.             if ((strcmp(myfile,"no file") == 0) || retval == NULL)
  133.                 return (-1);
  134.         }
  135.     } 
  136.     while (i < 0);
  137.  
  138.     return (fildes);
  139. }
  140.